package ihm_clarifiee.application;

import ihm_clarifiee.Control.CBacklog;
import ihm_clarifiee.Control.CHistoire;
import ihm_clarifiee.Control.CProjet;
import ihm_clarifiee.Control.CUsine;
import ihm_clarifiee.sauvegarde.Backlog_State;
import ihm_clarifiee.sauvegarde.CareTaker;
import ihm_clarifiee.sauvegarde.Originator;
import ihm_clarifiee.sauvegarde.Project_State;

import java.io.File;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import org.jdom.Attribute;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

/**
 * @(#) Backlog.java
 */

public class Backlog extends SaveAndRestore<Backlog_State, Backlog>
{
	protected ArrayList<Histoire> m_listeHistoires;
	private int m_taille;
	private Projet m_projet;
	private ArrayList<CHistoire> lch;
//  XML
    private static org.jdom.Document document;
    private static Element racine;
	
	public Backlog(Projet p){
		m_projet = p;
		m_listeHistoires= new ArrayList<Histoire>();
		lch = new ArrayList<CHistoire>();
        m_taille = 0;
        
//      Sauvegarde
        this.careTaker = new CareTaker<Backlog_State>();
        this.originator = new Originator<Backlog_State>(null);
	}
	
	protected void setProjet(Projet p){
		this.m_projet = p;
	}
	
	public void ajouterTete( Histoire h )
	{
		m_listeHistoires.add(0, h);
        m_taille++;
	}
	
	public void ajouterFin( Histoire h )
	{
		m_listeHistoires.add(m_listeHistoires.size(), h);
        m_taille++;
	}
	
	public Histoire getTete( )
	{
		return m_listeHistoires.get(0);
	}
	
	public Histoire getFin( )
	{
		return m_listeHistoires.get(m_listeHistoires.size()-1);
	}
	
	public void supprimerHistoire(Histoire h){
		m_listeHistoires.remove(h);
		m_taille--;
	}
	
	public void supprimerHistoire(int i){
		m_listeHistoires.remove(i);
		m_taille--;
	}

    public Histoire getHistoire(int i)
    {
    	return m_listeHistoires.get(i);
    }

    public int getTaille()
    {
    	return m_taille;
    }

    public void setHistoire(Histoire hist, int i){
    	if (i<m_taille && i>=0)
    	{
    		m_listeHistoires.set(i, hist);
    	}
    }

    public void setTaille(int i)
    {
    	m_taille = i;
    }
    
    public ArrayList<Histoire> getListeHistoires()
    {
    	return m_listeHistoires;
    }
    
    public void setListeHistoires(ArrayList<Histoire> h)
    {
    	m_listeHistoires.addAll(h); //= h;
    }
    
    public void saveToXML(String nomRepertoire){
//		tester si le state != null
		Backlog b_saved = careTaker.getMemento(0).getSaveState().getBacklog();

//		Creation du Document XML avec une racine
        racine = new Element("Backlog");
//        racine.setAttribute(new Attribute("titre",b_saved.getNomFichier()));
        document = new Document(racine);
        
		Element histoires = new Element("histoires");
		histoires.setAttribute(new Attribute("taille", String.valueOf(b_saved.getTaille())));
		racine.addContent(histoires);
		
		Iterator<Histoire> it = getListeHistoires().iterator();
		while(it.hasNext()){
			Histoire hist = it.next();
			Element h = new Element("histoire");
			h.setText(hist.getNom());
			histoires.addContent(h);
			hist.saveToXML(nomRepertoire);  //reflechir e un nom unique(ou creer un repertoire par projet)
		}
		enregistre(nomRepertoire+"/"+b_saved.getNomFichier()+".xml",document);
    }
    
    
    public static CBacklog restoreFromXML(String nomFichier, String nomRepertoire, Projet p) {
		//On cree une instance de SAXBuilder
		SAXBuilder sxb = new SAXBuilder();
		try
		{
			//On cree un nouveau document JDOM avec en argument le fichier XML
	        //Le parsing est termine ;)
	        document = sxb.build(new File(nomRepertoire+"/"+nomFichier+".xml"));
	     }
	     catch(Exception e){}

	     //On initialise un nouvel element racine avec l'element racine du document.
	     racine = document.getRootElement();
	    CBacklog b_restored = new CBacklog(p);
	    CUsine u = new CUsine();
	     
	    List<?> l = racine.getChildren();
	    
//	    Restauration de la liste des histoires
	    ArrayList<Histoire> histoires = new ArrayList<Histoire>();
		Element liste = (Element) l.get(0);
		List<?> listeHistoires = liste.getChildren();
		
		ArrayList<CHistoire> lch = new ArrayList<CHistoire>();
		
		int taille_liste = Integer.valueOf(liste.getAttributeValue("taille"));
		for(int i=0;i<taille_liste;i++){
			CHistoire ch = Histoire.restoreFromXML(b_restored,
					((Element) listeHistoires.get(i)).getText()+".xml",nomRepertoire);
			histoires.add(ch);
			lch.add(ch); System.out.println("Histoire added : "+ch.getNom());
		}//for
		
//		Set de la liste des histoires
		b_restored.setListeHistoires(histoires);
//		..et des Chistoire(pr la restauration des vues)
		b_restored.setListeCHistoires(lch);
//		TODO: Set le Projet
		b_restored.setProjet(p);
		
		return b_restored;	
    }

	@Override
	public void save() {
//		Creation d'un memento et ajout au careTaker
		originator.setState(new Backlog_State(this)); //faire un clone ??
		careTaker.addMemento(originator.saveToMemento());
		Iterator<Histoire> it = getListeHistoires().iterator();
		while(it.hasNext()){
			it.next().save();
		}	
	}

	@Override
	public void restore() {
		// TODO Auto-generated method stub
		
	}
	
	protected void setListeCHistoires(ArrayList<CHistoire> l){
		this.lch.addAll(l);
	}
	
	public ArrayList<CHistoire> getListeCHistoires(){
		return lch;
	}

	@Override
	public String getNomFichier() {
		// TODO Auto-generated method stub
		return "Backlog";
	}
	
	
	public Projet getProjet(){
		return m_projet;
	}
}
